package com.woniuxy.exception.handle;

import com.woniuxy.utils.ResponseResults;
import com.woniuxy.utils.ResponseState;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.InternalAuthenticationServiceException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


/**
 * 全局捕获登录异常
 *      1) 将日志级别改为root级别，控制台抛出InternalAuthenticationServiceException
 *      2）创建一个异常类，专门捕获InternalAuthenticationServiceException，并返回结果
 *      3） 这里是全局的，因此可以在此设置需要捕获的异常
 * */

// 给controller添加通知：如果controller抛出异常，它将去处理异常
@Slf4j
@RestControllerAdvice
public class HandleLoginException {

    /**
     * @ExceptionHandler 是一个接口，接口方法返回值是 Throwable[]数组，因此直接在注解中添加exception即可，无需重写一个方法
     * */
    @ExceptionHandler({
            InternalAuthenticationServiceException.class,  // 账号登录异常
            BadCredentialsException.class})                 // 账号不存在异常
    public ResponseResults<Boolean> handle(Exception e) {

        // 判断exception类型
        if (e instanceof InternalAuthenticationServiceException){
            // 账号不存在
        } else if (e instanceof BadCredentialsException){
            // 密码错误
        }
        System.out.println("捕获登录异常");
        return new ResponseResults<Boolean>()
                .setCode(401)
                .setState(ResponseState.NO_LOGIN)
                .setMsg("登陆失败，账号或密码有误")
                .setData(false);
    }


}
